# -*- coding: utf-8 -*-
#
# Autor: Vitor Letras nº3947
# Tendo por base o Código fornecido na Aula
# Data: 21/04/2011
#
#

import sqlite3
from collections import defaultdict
import SimpleHTTPServer
import SocketServer

# Cria as tabelas da base de dados senao existirem
def criar_tabelas():
    conn = sqlite3.connect('rebides.db')
    cursor = conn.cursor()
    cursor.execute("""CREATE TABLE IF NOT EXISTS graus 
                      (designacao TEXT PRIMARY KEY)
                   """)
    cursor.execute("""CREATE TABLE IF NOT EXISTS cursos
                      (designacao TEXT PRIMARY KEY)
                   """)
    cursor.execute("""CREATE TABLE IF NOT EXISTS categorias
                      (designacao TEXT PRIMARY KEY)
                   """)
    cursor.execute("""CREATE TABLE IF NOT EXISTS regimes
                      (designacao TEXT PRIMARY KEY)
                   """)
    cursor.execute("""CREATE TABLE IF NOT EXISTS estabelecimentos
                      (designacao TEXT PRIMARY KEY)
                   """)
    cursor.execute("""CREATE TABLE IF NOT EXISTS tipos_estabelecimento
                      (designacao TEXT PRIMARY KEY)
                   """)
    cursor.execute("""CREATE TABLE IF NOT EXISTS docentes
                      (nome_completo TEXT PRIMARY KEY, 
                       codigo INTEGER UNIQUE)
                   """)
    cursor.execute("""CREATE TABLE IF NOT EXISTS fichas_curso
                      (id INTEGER PRIMARY KEY AUTOINCREMENT, 
                       ano INTEGER,
                       docente REFERENCES docentes (nome_completo),
                       grau REFERENCES graus (designacao),
                       curso REFERENCES cursos (designacao))
                   """)
    
    cursor.execute("""CREATE TABLE IF NOT EXISTS fichas_docencia
                      (id INTEGER PRIMARY KEY AUTOINCREMENT, 
                       ano INTEGER,
                       docente REFERENCES docentes (nome_completo),
                       estabelecimento REFERENCES estabelecimentos (designacao),
                       categoria REFERENCES categorias (designacao),
                       regime REFERENCES regimes (designacao),
                       grau REFERENCES graus (designacao),
                       tipo_estabelecimento REFERENCES 
                       tipos_estabelecimento (designacao))
                   """)

    conn.close()
    pass

# Remove as tabelas da base de dados
def remover_tabelas():
    conn = sqlite3.connect('rebides.db')
    conn.execute('''drop table categorias''')
    conn.execute('''drop table cursos''')
    conn.execute('''drop table docentes''')
    conn.execute('''drop table estabelecimentos''')
    conn.execute('''drop table fichas_curso''')
    conn.execute('''drop table fichas_docencia''')
    conn.execute('''drop table graus''')
    conn.execute('''drop table regimes''')
    conn.execute('''drop table tipos_estabelecimentos''')

    conn.close()
    pass


# Retorna o Numero Total de Docentes no Ensino Superior 
def numTotalDocentesEnsinoSup(): # parametro ano
    conn = sqlite3.connect('rebides.db')
    c = conn.cursor()
    
    totalDocentes = 0
    docentes = {}
    for i in range(10):
        cmd = "SELECT COUNT(DISTINCT docente) FROM fichas_curso WHERE ano = '{0}'".format(i)
        c.execute(cmd)
        for row in c:
            totalDocentes += row[0]
            docentes[i] = row[0]
          
    percentagemDocentes = {}
    for i in range(10):
        percentagemDocentes[i] = docentes[i] * 100 / totalDocentes        

    return docentes
 
# Retorna o numero total de Docentes Num Estabelecimento num dado ano
def numTotalDocentesEstabAno():
    conn = sqlite3.connect('rebides.db')
    c = conn.cursor()
    estabelecimentos = getEstabelecimentos()
        
    docentes = {}
    for estabelecimento in estabelecimentos:
        anos = {}
        for i in range(10):
            cmd = "SELECT COUNT(DISTINCT docente) from fichas_docencia WHERE ano = '{0}' AND estabelecimento LIKE '{1}'".format(i, estabelecimentos[estabelecimento].encode('utf-8'))
            c.execute(cmd)
            for row in c:
                anos[i] = row[0]
                print row[0]
        docentes[estabelecimento] = anos
    return docentes
    
## Retorna o numero total de Docentes numa Instituicao num dado ano
def numTotalDocentesInstituAno():
    conn = sqlite3.connect('rebides.db')
    c = conn.cursor()
    instituicoes = getInstituicoes()
        
    docentes = {}
    for instituicao in instituicoes:
        anos = {}
        for i in range(10):
            cmd = "SELECT COUNT(DISTINCT docente) from fichas_docencia WHERE ano = '{0}' AND tipo_estabelecimento LIKE '{1}'".format(i, instituicoes[instituicao].encode('utf-8'))
            c.execute(cmd)
            for row in c:
                anos[i] = row[0]
        docentes[instituicao] = anos      
    return docentes
    
# Retorna o Numero Total de Docentes detentores de um Grau
# num Estabelicimento num dado Ano
def numTotalDocentesGrauAno():
    conn = sqlite3.connect('rebides.db')
    c = conn.cursor()
    graus = getGraus()
    docentes = {}
    for grau in graus:
        anos = {}
        for i in range(10):
            cmd = "SELECT COUNT(DISTINCT docente) from fichas_docencia WHERE ano = '{0}' AND grau LIKE '{1}'".format(i, graus[grau].encode('utf-8'))
            c.execute(cmd)
            for row in c:
                anos[i] = row[0]
                #docentes[grau][i] = row[0]
        docentes[grau] = anos
                
    return docentes 
    pass
    
# Retorna o Numero Total de Docentes detentores de um Grau
# num Estabelicimento num dado Ano
def numTotalDocentesGrauEstabAno():
    conn = sqlite3.connect('rebides.db')
    c = conn.cursor()
    graus = getGraus()
    estabelecimentos = getEstabelecimentos()
    docentes = {}
    for estabelecimento in estabelecimentos:
        graus = {}
        for grau in graus:
            anos = {}
            for i in range(10):
                cmd = "SELECT COUNT(DISTINCT docente) from fichas_docencia WHERE ano = '{0}' AND grau LIKE '{1}' AND estabelecimento LIKE '{2}'".format(i, grau.encode('utf-8'), estabelecimento)
                c.execute(cmd)
                for row in c:
                    anos[i] = row[0]
            graus[grau] = anos
        docentes[estabelecimento] = graus
    return docentes
                    
# Retorna o numero de Estabelecimentos da Base de Dados
def getEstabelecimentos():
    conn = sqlite3.connect('rebides.db')
    c = conn.cursor()
    estabelecimentos = {}
    i = 0
    cmd = "SELECT * FROM estabelecimentos"
    c.execute(cmd)
    for row in c:
        estabelecimentos[i] = row[0]
        i += 1
    return estabelecimentos

# Retorna o numero de Instituicoes da Base de Dados
def getInstituicoes():
    conn = sqlite3.connect('rebides.db')
    c = conn.cursor()
    instituicoes = {}
    cmd = "SELECT * FROM tipos_estabelecimento"
    c.execute(cmd)
    i = 0
    for row in c:
        instituicoes[i] = row[0]
        i += 1
        
    return instituicoes

# Retorna o numero de graus existentes na Base de Dados
def getGraus():
    conn = sqlite3.connect('rebides.db')
    c = conn.cursor()
    graus = {}
    cmd = "SELECT * FROM graus"
    c.execute(cmd)
    i = 0
    for row in c:
        graus[i] = row[0]
        i += 1
        
    return graus


# Retorna uma lista do Numero de Insituicoes num dado ano
def listaInstituicoesAno(ano):
    conn = sqlite3.connect('rebides.db')
    c = conn.cursor()
    cmd = "SELECT DISTINCT tipo_estabelecimento FROM fichas_docencia WHERE ano = '{0}'".format(ano)
    c.execute(cmd)
    instituicoes = []
    for row in c:
        instituicoes.append(row[0])
    return instituicoes


# Retorna uma lista com o numero de Instituicoes e com os 
# respectivos estabelecimentos de um dado ano
def listaInstituicoesEstabelecimentosAno(ano):
    instituicoes = getInstituicoes()
    conn = sqlite3.connect('rebides.db')
    c = conn.cursor()
    lista = defaultdict(list)
    for instituicao in instituicoes:
        cmd = "SELECT DISTINCT estabelecimento FROM fichas_docencia WHERE ano = '{0}' AND tipo_estabelecimento LIKE '{1}'".format(ano, instituicoes[instituicao].encode('utf-8'))
        c.execute(cmd)
        for row in c:
            lista[instituicao].append(row[0])
        
    return lista


# Retorna uma lista de o total de Docentes detentores de um Grau
# Doutourado, Mestre ou Licenciado
def listaDetentoresGrauAno(ano):
    graus = getGraus()
    conn = sqlite3.connect('rebides.db')
    c = conn.cursor()
    lista = defaultdict(list)
    for grau in graus:
        cmd = "SELECT DISTINCT docente FROM fichas_docencia WHERE ano = '{0}' AND grau LIKE '{1}'".format(ano, graus[grau].encode('utf-8'))
        c.execute(cmd)
        for row in c:
            lista[grau].append(row[0])
            
    return lista

# Define um Servidor na porta 8000 
def iniciarWebSrv():
    PORT = 8000
    Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
    httpd = SocketServer.TCPServer(("", PORT), Handler)
    print "serving at port", PORT
    httpd.serve_forever()
        